package reflect;

import java.lang.reflect.Method;
import java.util.Scanner;

/**
 * reflect 反射，反映
 *
 * 反射是java的动态机制，允许程序在运行期间再确定:实例化对象，调用方法，操作属性等
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        /*
            反射机制使用的第一步:获取要操作的类的类对象(Class的实例)
            在JVM内部，每个被加载的类都有且只有一个类对象。
            通过这个类的类对象我们可以了解到这个类的相关信息(有什么构造器，方法，属性等等)
            获取一个类的类对象的方法:
            1.类名.class
            2.Class.forName("类的完全限定名")  完全限定名:包名.类名
            3:类加载器.loadClass("类的完全限定名")
         */
        //获取String的类对象
//        Class cls = String.class;
//        Class cls = ArrayList.class;

//        Class cls = Class.forName("java.lang.String");

        /*
            java.lang.String
            java.util.HashMap
            java.io.FileInputStream
            java.io.File
         */
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个类的名字");
        String className = scanner.nextLine();
        Class cls = Class.forName(className);



        String name = cls.getName();//获取其表示的类的完全限定名
        System.out.println(name);
        name = cls.getSimpleName();//仅获取类名
        System.out.println(name);
        /*
            该方法会返回一个Package实例
            Package是反射对象之一，该类的每一个实例用于表示一个包的信息
         */
        Package pack = cls.getPackage();//获取包信息
        String packName = pack.getName();
        System.out.println(packName);
        /*
            获取到当前Class对象表示类中的所有公开方法(包括从超类继承的)
            Method[] getMethods()

            Method类，称为方法对象，反射对象之一
            它的每一个实例用于表示一个方法
         */
        Method[] methods = cls.getMethods();
        System.out.println("一共有:"+methods.length+"个方法");
        for(Method m:methods){
            System.out.println(m.getName());
        }
    }
}





